﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GmepModelBase.h"
#include "IConfigRecord.h"

namespace gmep
{
    /// \brief  CommonConfig配置记录的名称
    struct GMEP_MODEL_BASE_EXPORT CommonConfigRecordNames
    {
        static const wchar_t * AuthorizationType;                ///< 授权类型
        static const wchar_t * EnableRenderPatchCombine;         ///< 开启渲染动态批次合并
        static const wchar_t * TrialActivityLabel;               ///< 试用活动编码
        static const wchar_t * CloudType;                        ///< 云环境类型
        static const wchar_t * ReleaseVersionType;               ///< 发布版本类型，整数值: 0 - 国内版; 1 - 国际版; 2 - 深化设计版; 3 - 全部插件版; 4 - 平台版; 
    };
    /// \brief  产品许可类型值
    struct GMEP_MODEL_BASE_EXPORT AuthorizationTypeRecordValues
    {
        static const wchar_t * Common;                          ///< 通用
        static const wchar_t * Collaboration;                   ///< 协同
        static const wchar_t * Collaboration_WithLocalFile;     ///< 协同+本地文件
        static const wchar_t * Local;                           ///< 单机版
    };

    /// \brief  许可类型的产品标识
    struct GMEP_MODEL_BASE_EXPORT AuthorizationTypeProductIdentity
    {
        static const wchar_t * Common;                          ///< 通用
        static const wchar_t * Collaboration;                   ///< 协同
        static const wchar_t * Collaboration_WithLocalFile;     ///< 协同+本地文件
        static const wchar_t * Local;                           ///< 单机版
    };

    /// \brief  云环境类型
    struct GMEP_MODEL_BASE_EXPORT CloudTypeRecordValues
    {
        static const wchar_t * PublicCloud;                     ///< 公有云
        static const wchar_t * PrivateCloud;                    ///< 私有云
    };

    /// \brief  版本类型
    enum class GmepReleaseVersionType :uint32_t
    {
        domestiVersion = 0,                  ///< 国内版
        internationalVersion = 1,            ///< 国际版
        deepeningDesignVersion = 2,          ///< 深化设计版本
        allPlugInVersions = 3,               ///< 全插件版本
        platformVersion = 4,                 ///< 平台版本
    };

    /// \brief  管理行为配置文件
    class GMEP_MODEL_BASE_EXPORT ICommonConfig
    {
    public:
        /// \brief 设置配置文件路径，并加载配置项。 第一次使用前，用户需指定common_config的路径。
        /// \param configPath 配置文件路径。
        /// \return 设置成功则返回true；否则，返回false。
        static bool SetConfigPath(const std::wstring& configPath);

        /// \brief 通过配置项名称获取配置项。
        /// \param recordName 配置项名称。
        /// \return 返回配置项，如果不存在，则返回nullptr。
        static const gcmp::IConfigRecord* GetConfigRecord(const std::wstring& recordName);

        /// \brief 获取配置项的整型值。
        /// \param recordName 配置项名称。
        /// \return 如果存在，则返回其整型值，如果不存在则返回0。
       // static int GetConfigRecordValueAsInt(const std::wstring& recordName);

        /// \brief 获取配置项的浮点值。
        /// \param recordName 配置项名称。
        /// \return 如果存在，则返回其浮点值，如果不存在则返回0.0。
      //  static double GetConfigRecordValueAsDouble(const std::wstring& recordName);

        /// \brief 获取配置项的字符串值。
        /// \param recordName 配置项名称。
        /// \return 如果存在，则返回其字符串值，如果不存在则返回空字符串。
        static std::wstring GetConfigRecordValueAsString(const std::wstring& recordName);

        /// \brief 保存配置文件。
        /// \return 成功则返回true，否则返回false。
       // static bool SaveConfigFile();

        /// \brief 是否为合法产品许可。
        /// \param productType 产品许可名称。
        /// \return 是合法的则返回true，否则返回false。
        static bool IsValidAuthorizationType(const std::wstring& authorizationType);

        /// \brief 添加一条配置，如果同名配置已存在，则跳过并返回false。
        /// \param opConfigRecord 要添加的配置项。
        /// \return 添加配置成功则返回true，否则返回false。
       // static bool AddConfigRecord(gcmp::OwnerPtr<gcmp::IConfigRecord> opConfigRecord);

        /// \brief 修改一条配置，不存在则跳过并返回false。
        /// \param opConfigRecord 要更新的配置项
        /// \return 更新成功则返回true，否则返回false。
        static bool UpdateConfigRecord(gcmp::OwnerPtr<gcmp::IConfigRecord> opConfigRecord);

        // \brief  获取当前产品的产品标识
        static std::wstring GetProductIdentity();

        // \brief  将最新的通用配置信息保存到文件中
        static bool SaveConfigDataToFile();
    };
}

